package com.itheima.tlias.util;

import com.alibaba.fastjson.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;

import java.util.Date;

/**
 * jwt token 生成与验证(解析)
 */
public class JwtUtil {

    private static final String SIG = "a97bf052-8baa-44ff-a461-67f2509fffbc";

    private JwtUtil(){

    }

    /**
     * 生产token
     * @param username payload用户名
     * @param password payload密码
     * @param minutes token过期时间,以分钟为单位
     * @return token
     */
    public static String generateToken(String username,String password,int minutes){
        Date now = new Date();
        //1. 构建jwt对象
        //2. 指定header(一般省略)
        return Jwts.builder()
                .claim("username", username)
                .claim("password", password)
                //3. 放置payload,以及过期时间和生效时间
                .issuedAt(now)
                .expiration(new Date(now.getTime() + 60L * 1000 * minutes))
                //4. 进行数字签名
                .signWith(Keys.hmacShaKeyFor(SIG.getBytes()), Jwts.SIG.HS256)
                //5. 生成token
                .compact();
    }

    /**
     * 验证token
     *
     * @param token 生成的令牌
     * @return payload中的用户信息
     */
    public static JSONObject verifyToken(String token){
        //1. 构建解析对象
        JwtParser parser = Jwts.parser().verifyWith(Keys.hmacShaKeyFor(SIG.getBytes())).build();
        //2. 指定数字签名
        Claims payload = parser.parseSignedClaims(token).getPayload();
        JSONObject jsonObject = new JSONObject();
        //3. 指定被签名后的token
        jsonObject.put("username",payload.get("username"));
        jsonObject.put("password",payload.get("password"));
        //还没有完成token失效的处理以及token字符串不合法的处理
        return jsonObject;
    }
}
